
import win32com.client
import queue
from concurrent.futures import ThreadPoolExecutor, wait


def ConvertByWps(sourceFile, targetFile):
    if not os.path.exists(sourceFile):
        print(sourceFile + "不存在，无法继续！")
        return False
    typemap = {
        'doc': 'word',
        'docx': 'word',
        'ppt': 'ppt',
        'pptx': 'ppt',
        'xls': 'excel',
        'xlsx': 'excel',
    }
    name_arr = sourceFile.split(".")
    suffix = name_arr[len(name_arr) - 1]
    wpstype = typemap.get(suffix)

    if (wpstype is None):
        return False

    os.system('taskkill /im wps.exe')
    # 如果文件存在就删除
    if os.path.exists(targetFile):
        os.remove(targetFile)
    if wpstype == 'word':
        ConvertDocToPdf(sourceFile, targetFile)
    elif wpstype == 'ppt':
        ConvertPptToPdf(sourceFile, targetFile)
    elif wpstype == 'excel':
        ConvertXlsToPdf(sourceFile, targetFile)
    if os.path.exists(targetFile):
        return True
    else:
        return False


# 转换 Word文件档到pdf
def ConvertDocToPdf(src, dst):
    wps = win32com.client.Dispatch("Kwps.Application")
    wps.Visible = False
    doc = wps.Documents.Open(src)
    doc.ExportAsFixedFormat(dst, 17)
    doc.Close()
    wps.Quit()


# 转换 PPT文件档到pdf
def ConvertPptToPdf(src, dst):
    wps = win32com.client.Dispatch("Kwpp.Application")
    wps.Visible = False
    ppt = wps.Presentations.Open(src)
    ppt.SaveAs(dst, 32)
    ppt.Close()
    wps.Quit()


# 转换 XLS文件档到pdf
def ConvertXlsToPdf(src, dst):
    wps = win32com.client.Dispatch("Ket.Application")
    excel = wps.Workbooks.Open(src)
    excel.ExportAsFixedFormat(0, dst)
    excel.Close()
    wps.Quit()





q = queue.Queue()


def run():
    while q.qsize() > 0:
        data_json = q.get_nowait()
        doc_path = data_json.get("doc_path", '')
        pdf_path = data_json.get("pdf_path", '')
        # for j in range(3):
            # try:
            #     r = ConvertByWps(doc_path, pdf_path)
            #     if r:
            #         ConvertDocToPdf(doc_path, pdf_path)
            #         break
            #     else:
            #         print('失败{}次'.format(j))
            # except Exception as e:
            #     print(e, ' ------  ', pdf_path, i)


if __name__ == '__main__':
    import os

    dis_path = "D:/集团3C产品数据处理开发/研究报告/研究报告"
    for i in os.listdir(dis_path):
        doc_path = dis_path + '/' + i
        pdf_path = "D:/aa/pdf_path/" + i.replace(i.split('.')[-1], 'pdf')
        q.put_nowait(
            {'doc_path': doc_path, 'pdf_path': pdf_path}
        )

    executor = ThreadPoolExecutor(1)
    all_task = [executor.submit(run) for i in range(1)]
    wait(all_task)
    executor.shutdown()